import Vector2 from "./Vector2";
import Matrix2D from "./Matrix2D";
import Math2D from "./Math2D";

export default class Transform2D {
    public position: Vector2;                                                   // 位移
    public rotation: number;                                                 //方位（角度表示）
    public scale: Vector2;                                                          // 缩放

    public constructor(x: number = 0, y: number = 0, rotation: number = 0, scaleX: number = 1, scaleY: number = 1) {
        this.position = new Vector2(x, y);
        this.rotation = rotation;
        this.scale = new Vector2(scaleX, scaleY);
    }

    public toMatrix(): Matrix2D {
        // 设置矩阵栈顶矩阵归一化
        Math2D.matrixStack.loadIdentity();
        // 先平移
        Math2D.matrixStack.translate(this.position.x, this.position.y);
        // 然后旋转，最后一个参数false，表示rotation是角度而不是弧度
        Math2D.matrixStack.rotate(this.rotation, false);
        // 最后缩放操作
        Math2D.matrixStack.scale(this.scale.x, this.scale.y);
        // 返回TRS合成后的，表示从局部到世界的变换矩阵
        return Math2D.matrixStack.matrix;
    }

    public toInvMatrix(result: Matrix2D): boolean {
        // 获取局部到世界的变换矩阵
        let mat: Matrix2D = this.toMatrix();
        // 对mat矩阵求逆，获得从世界到局部的变换矩阵
        return Matrix2D.invert(mat, result);
    }
}